package main

import (
	"fmt"
	"learngo/tree"
)

type myTreeNode struct {
	*tree.Node //Embedding内嵌
}

func (myNode *myTreeNode) Traverse() {
	fmt.Println("this method is shadowed")
}
func (myNode *myTreeNode) postOrder() {

	if myNode == nil || myNode.Node == nil {
		return
	}
	left := myTreeNode{myNode.Left}
	left.postOrder()
	right := myTreeNode{Node: myNode.Right}
	right.postOrder()
	myNode.Print()
}

/**
包：
1、每个目录一个包
2、main包包含可执行入口
3、为结构定义的方法必须放在同一个包内
4、可以是不同文件

如何扩充系统类型或者别人的类型
1、定义别名
2、使用组合
3、使用内嵌：需要省下许多代码

*/
func main() {

	root := &tree.Node{Value: 1}
	root.Left = &tree.Node{2, nil, nil}
	root.Right = &tree.Node{3, nil, nil}
	root.Right.Left = new(tree.Node)
	root.Left.Right = tree.CreateNode(6)

	root.Traverse()

	c := root.TraverseWithChannel()
	maxNode := 0
	for node := range c {
		if node.Value > maxNode {
			maxNode = node.Value
		}
	}
	fmt.Println("Max node value: ", maxNode)
}

//func main() {
//
//	root := myTreeNode{&tree.Node{Value: 1}}
//	root.Left = &tree.Node{}
//	root.Right = &tree.Node{3, nil, nil}
//	root.Right.Left = new(tree.Node)
//	root.Left.Right = tree.CreateNode(6)
//
//	root.Traverse()
//
//	nodes := []tree.Node{
//		{Value: 3},
//		{},
//	}
//
//	fmt.Println(nodes)
//
//	fmt.Println()
//
//	root.Print()
//
//	fmt.Println()
//
//	root.SetValue(5)
//
//	root.Print()
//
//	fmt.Println()
//
//	pRoot := &root
//	pRoot.Print()
//	pRoot.SetValue(100)
//	pRoot.Print()
//
//	var pRootnil *tree.Node
//	pRootnil.SetValue(200)
//
//	fmt.Println()
//
//	root.Traverse()
//	root.Node.Traverse()
//
//	fmt.Println("---------------- myTreeNode begin ----------------")
//
//	myNode := &root
//	myNode.postOrder()
//
//	fmt.Println("---------------- myTreeNode end   ----------------")
//
//	//var baseRoot *tree.Node
//	//baseRoot := &root
//}
